/*!
 * part of the package to convert web2py elements to bootstrap3 theme
 * Developed by Paolo Caruccio ( paolo.caruccio66@gmail.com )
 * Released under MIT license
 * version 1 rev.201312222030
 * 
 * Supported version of bootstrap framework: 3.0.2+

 * The full package includes:
 * - bootstrap3.py python module
 * - web2py-bootstrap3.css
 * - this js file
 * - example of layout.html

 */

(function ($) {

    // bootstrap3 classes for elements of horizontal form - data
    var FH_CL_PREFIX = 'col-md-', // class prefix
        FH_LABEL_COLW = '4', // nr. of columns of 12 
        FH_CONTROL_COLW = '8' // 12 - FH_LABEL_COLW;

    // bootstrap3 classes for elements of horizontal form - calculations
    var fh_label_class = FH_CL_PREFIX + FH_LABEL_COLW,
        fh_offest_class = FH_CL_PREFIX+'offset-'+FH_LABEL_COLW,
        fh_control_class = FH_CL_PREFIX + FH_CONTROL_COLW;

    // functions
    function menu_is_collapsed() {
        return !$('.navbar-toggle').is(':hidden')
    };

    function closeSubmenu() {
        $(".dropdown-submenu>a.active").each(function(){
            var o = $(this);
            o.parent().children("ul").toggleClass('open').data('phase', null);
            o.toggleClass('active');
        });
    };

    $.fn.center = function (options) {
        var defaults = {'parent': false, 'mode': "both"};
        var settings = $.extend(defaults, options);
        var parent;
        if (settings.parent) {
            parent = this.parent();
        } else {
            parent = window;
        }
        if (settings.mode != "horizontally") {
            this.css("top", Math.max(0, (($(parent).height() - $(this).outerHeight()) / 2) + $(parent).scrollTop()) + "px");}
        if (settings.mode != "vertically") {
            this.css("left", Math.max(0, (($(parent).width() - $(this).outerWidth()) / 2) + $(parent).scrollLeft()) + "px");}
        return this;
    };

    function adjust_maxheight_of_collapsed_nav() {
        var cn = $('div.navbar-collapse');
        var sh = $(window).height();
        if (cn.get(0)) {
            if (sh<320) {
                cn.addClass('short-screen');
            }
            else {
                cn.removeClass('short-screen');
            }
        }
    };

    // alert centering
    $('.flash.alert').center({'mode': "horizontally"});

    // navs
    $(".nav ul.dropdown-menu").not("#w2p-auth-bar").each(function() {
        var toggle = $(this).parent();
        if (toggle.parent().hasClass("nav")) {
            toggle.attr("data-w2pmenulevel", "l0");
            toggle.children("a")
                .addClass("dropdown-toggle")
                .append('<span class="caret"> </span>')
                .attr("data-toggle", "dropdown");
        } else {
            toggle.addClass("dropdown-submenu").removeClass("dropdown");
        };
    });

    $('.navbar-nav a.dropdown-toggle').click(function(e) {
        if (menu_is_collapsed()) {
            e.preventDefault();
        }else{
            window.location=$(this).attr('href');
        };
    });

    $(".dropdown-submenu>a").click(function(event) {
        if (menu_is_collapsed()) {
            event.preventDefault();
            event.stopPropagation();
            var submenu = $(this).parent().children("ul");
            submenu.data('phase','opening');
            var dropdownOfThis = $(this).parent().parent();
            var actives = dropdownOfThis.find('ul.dropdown-menu.open');
            if (actives && actives.length) {
                var hasData = actives.data('phase');
                if (hasData && hasData=='opened') {
                    actives.removeClass('open');
                    actives.siblings('a.active').removeClass('active');
                    hasData || actives.data('phase', null);
                };
            };
            submenu.toggleClass('open').data('phase','opened');
            $(this).toggleClass('active');
        }else{
            window.location=$(this).attr('href');
        };
    });

    $(".nav-tabs .web2py-menu-active").addClass('active');
    $(".nav-tabs a").not(".dropdown-toggle").attr("data-toggle", "tab");

    // form fixes
    $(document).ready(function() {
        $("form.bs3-form .w2p_list a").each(function() {
            // the plus and minus buttons are generated by web2py.js
            $(this).addClass('btn btn-default');
        });
        $("form.bs3-form p.w2p-autocomplete-widget").each(function() {
            // not generated by formstyle
            $(this).children('input').addClass('form-control');
        });
        $("form.bs3-form input[name='password_two']").each(function() {
            // auth addition after form creation
            var $this = $(this).addClass('form-control');
            var groupClass = 'form-group'
            var labelClass = 'control-label';
            var commentClass = 'help-block';
            var comment;
            var mode;
            var hasError = false;
            if ($this.parent().hasClass('form-horizontal')) {
                mode = 'horizontal'
                labelClass = fh_label_class+' control-label';
            };
            if ($this.parent().hasClass('form-inline')) {
                mode = 'inline';
                labelClass = 'sr-only';
                commentClass = 'sr-only';
                var labelText = $this.prev('label').text();
                $this.attr("placeholder", labelText.slice(0,-2));
            };
            var error = $this.next('div.error_wrapper');
            if (error.length > 0) {
                var hasError = true;
                groupClass = 'form-group has-error'
                var text = error[0].nextSibling.nodeValue;
                    if (text) {
                        comment = "<span class='"+commentClass+"'>"+text+"</span>";
                        error[0].parentNode.removeChild(error[0].nextSibling);
                    };
            } else {
                var text = $this[0].nextSibling.nodeValue;
                if (text) {
                    comment = "<span class='"+commentClass+"'>"+text+"</span>";
                    $this[0].parentNode.removeChild($this[0].nextSibling);
                };
            };
            $this.prev('label').addClass(labelClass).andSelf().wrapAll("<div class='"+groupClass+"' id='auth_user_verify_password__row'></div>");
            if (mode == 'horizontal') {
                $this.wrap('<div class="'+fh_control_class+'"></div>');
            };
            if (hasError) {
                $this.parent().append(error);
            };
            $this.parent().append(comment);
        });
        $('form.bs3-form #auth_user_remember').each(function() {
            // auth addition after form creation
            var $input = $(this);
            var $label = $input.next('label');
            var $iParent = $input.parent();
            $input.removeClass('checkbox');
            $iParent.prev('label').remove();
            $input.prependTo($label);
            var newGroup = $label;
            $iParent.replaceWith(newGroup);
            if (newGroup.parent().hasClass('form-horizontal')) {
                newGroup.wrap($('<div class="form-group"><div class="'+fh_offest_class+' '+fh_control_class+'"><div class="checkbox"></div></div></div>'));
            } else {
                newGroup.wrap($('<div class="form-group"><div class="checkbox"></div></div>'));
            };
        });
    });

    // form errors
    $('form.bs3-form .error_wrapper').each(function() {
        var $this = $(this)
        var rcContainer = $this.parents('.rc_container');
        if (rcContainer.length > 0) {
            $this.appendTo(rcContainer);
        }
    });
    $('form.bs3-form').find('div.error').addClass('text-danger').closest(".form-group").addClass('has-error');
    
    // uploadwidget
    $('#file-reset-btn').click(function() {
        var el = $('div.w2p-uploaded-file')[0];
        var whatReset = jQuery.data(el, "reset");
        if (whatReset == "changed") {
            $('.w2p-uploaded-file input[type="file"]')
                .replaceWith(
                    $('.w2p-uploaded-file input[type="file"]')
                        .clone());
            $('.w2p-file-preview, .w2p-uploaded-file input[type="file"], #edit-btn-dd, #file-reset-btn').toggle();
        }else{
            $('.w2p-file-preview, #no-file, #edit-btn-dd, #file-reset-btn').toggle();
            $('div.w2p-uploaded-file').children('input[type=checkbox]').trigger('click');
        }
        jQuery.removeData(el, "reset");
    });
    $('#change-file-option').click(function(e) {
        e.preventDefault();
        $('.w2p-file-preview, .w2p-uploaded-file input[type="file"], #edit-btn-dd, #file-reset-btn').toggle();
        jQuery.data($('div.w2p-uploaded-file')[0], "reset", "changed");
    });
    $('#delete-file-option').click(function(e) {
        e.preventDefault();
        var wimg = $('#image-thumb').outerWidth(),
            himg = $('#image-thumb').outerHeight();
        $('#no-file')
            .width(wimg)
            .height(himg)
            .css({'line-height':himg+'px'});
        $('.w2p-file-preview, #no-file, #edit-btn-dd, #file-reset-btn').toggle();
        $('div.w2p-uploaded-file').children('input[type=checkbox]').trigger('click');
        jQuery.data($('div.w2p-uploaded-file')[0], "reset", "deleted");
    });

    // on page load
    adjust_maxheight_of_collapsed_nav();

    // resize and orientation change events
    $(window).on('orientationchange resize', function(event) {
        adjust_maxheight_of_collapsed_nav();
        $('.flash.alert').center({'mode':"horizontally"});
        if (menu_is_collapsed() === false) {
            closeSubmenu();
            $('.navbar-nav .dropdown.open a.dropdown-toggle').dropdown('toggle');
            $('#main-menu.in, #login-menu.in').collapse('hide');
        };
    });

}(jQuery));
